package com.axon.base.helpers
{
	import com.axon.base.managers.AxErrorManager;
	
	import flash.utils.getDefinitionByName;
	import flash.utils.getQualifiedClassName;
	
	import mx.utils.ObjectUtil;
	
	public class AxReflectionUtils
	{
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function getClassNameByInstance(obj: Object): String
		{
			return getQualifiedClassName(obj).split('::')[1];
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function getClassNameByRef(clazz: Class): String
		{
			return (ObjectUtil.getClassInfo(clazz).name as String).split('::')[1];
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function getClassFullPathByInstance(obj: Object): String
		{
			return getQualifiedClassName(obj).replace("::",".");
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function getClassFullPathByRef(clazz: Class): String
		{
			return (ObjectUtil.getClassInfo(clazz).name as String)..replace("::",".");
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
		public static function getClassRefByFullPath(fqn: String, showFailureIfError: Boolean = true): Class
		{
			var result: Class = null;
			
			try {
				
				result = getDefinitionByName(fqn) as Class; }
				 
			catch (e:ReferenceError) {
				 
				if (showFailureIfError) 
					AxErrorManager.showFailure(new AxFailure(
						"Message for Software Engineers:\n\nHey guys, you must implement class " + fqn + ".")); }

			return result;				
		}
		
	}
}